package com.example.demo.util;

//import sun.nio.ch.IOUtil;

import top.starp.util.IoUtil;

import java.io.*;

public class CmdTask implements Runnable {
    private String command;

    public static void main(String[] args) throws IOException {

//        java.io.IOException: Cannot run program "dir": CreateProcess error=2, 系统找不到指定的文件。
//   直接写这个命令是错的
        //        CmdTask cmdTask = new CmdTask("dir");


//        CmdTask cmdTask
//        testCmd();
//        testThread();
//        是 /c 的原因 。。
//        这样是可以读出的 写在线程里面不行

//        runCmdAndShow("cmd /c cd d:/proj");
//        runCmdAndShow("cmd /c dir");
//        runCmdAndShow("cmd /c dir d:/proj");
//        不能是左边的 斜杠/
//        可以
//        cmd /c dir 是执行完dir命令后关闭命令窗口。
        runCmdAndShow("cmd /c dir d:\\proj");
    }

    static void testThread() {
//        cmd /c dir 是执行完dir命令后关闭命令窗口。

//
//        String commandStr = "cmd /c dir";
        String commandStr = "cmd /c cd d:/proj";
//        CmdTask cmdTask = new CmdTask("cmd dir");
        CmdTask cmdTask = new CmdTask(commandStr);
        Thread thread = new Thread(cmdTask);
        thread.start();
    }

  public static   void runCmdAndShow(String commandStr) throws IOException {
        Process exec = Runtime.getRuntime().exec(commandStr);
        System.out.println("exec");
        System.out.println(exec);
//        IOUtil.
        IoUtil.read(exec.getInputStream());
    }

    static void testCmd() throws IOException {
//     cmd /c dir 是执行完dir命令后关闭命令窗口。


//     String commandStr="cmd dir";
        String commandStr = "cmd /c dir";
//        是 /c 的原因吗
        Process exec = Runtime.getRuntime().exec(commandStr);
        System.out.println("exec");
        System.out.println(exec);
//        IOUtil.
        IoUtil.read(exec.getInputStream());
//        OutputStream outputStream = exec.getOutputStream();
////        InputStreamReader isr = new InputStreamReader(inputStream, "GB2312");
//        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "GB2312");
////        outputStreamWriter.write();
//        BufferedReader br = new BufferedReader(outputStream);
////                BufferedReader 读出来是 中文乱码
//        String line = null;
//        while ((line = br.readLine()) != null) {
//            System.out.println(printType + ">" + line);
//        }
    }

    public CmdTask(String command) {
        this.command = command;
    }

    @Override
    public void run() {
        Process process = null;
        int exitVal = 0;
        try {
            process = Runtime.getRuntime().exec(command);
            // Runtime.exec()创建的子进程公用父进程的流，不同平台上，
            // 父进程的stream buffer可能被打满导致子进程阻塞，从而永远无法返回。
            //针对这种情况，我们只需要将子进程的stream重定向出来即可。
            new RedirCmdStreamThread(process.getInputStream(), "INFO").start();
            new RedirCmdStreamThread(process.getErrorStream(), "ERR").start();

            exitVal = process.waitFor();
            System.out.println("exitVal");
            System.out.println(exitVal);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

        if (exitVal != 0) {
            throw new RuntimeException("cmd任务执行失败");
        }
    }

    class RedirCmdStreamThread extends Thread {
        InputStream inputStream;
        String printType;

        RedirCmdStreamThread(InputStream inputStream, String printType) {
            this.inputStream = inputStream;
            this.printType = printType;
        }

        public void run() {
            try {
//                https://blog.csdn.net/cl2010abc/article/details/88058517
                InputStreamReader isr = new InputStreamReader(inputStream, "GB2312");
                BufferedReader br = new BufferedReader(isr);
//                BufferedReader 读出来是 中文乱码
                String line = null;
                while ((line = br.readLine()) != null) {
                    System.out.println(printType + ">" + line);
                }

            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
}
